package com.cast.s3p.controladores;

import com.cast.s3p.persistencia.EvaluadorJpaController;
import com.cast.s3p.persistencia.EmpleadoJpaController;
import com.cast.s3p.persistencia.ProyectoJpaController;
import com.cast.s3p.persistencia.DepartamentoJpaController;
import com.cast.s3p.persistencia.UsuariosJpaController;
import com.cast.s3p.persistencia.Departamento;
import com.cast.s3p.persistencia.Empleado;
import com.cast.s3p.persistencia.Evaluador;
import com.cast.s3p.persistencia.Usuarios;
import com.cast.s3p.persistencia.VersionesJpaController;
import com.cast.s3p.persistencia.ctrl.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.List;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.NoResultException;

/**
 * Select3Proyect
 * Univalle - Desarrollo de Software II
 *
 * ((Creador && Mantenedor) == Spider)
 * E-Mail == cadiraca@gmail.com
 *
 * Clase que evita acoplar el resto de la aplicación con clases controladores de JPA
 *
 *
 * Un controlador para controlarlos a Todos, El Señor de los Controladores.  En honor de Smeagol.
 * ChibchASoft 2011, Licencia GPL
 */

public class Precioso implements Serializable{
    DepartamentoJpaController controladorJPADepartamentoGL;
    EmpleadoJpaController controladorJPAEmpleadoGL;
    EvaluadorJpaController controladorJPAEvaluadorGL;
    ProyectoJpaController controladorJPAProyectoGL;
    UsuariosJpaController controladorJPAUsuariosGL;
    VersionesJpaController controladorJPAVersionesGL;


    //Método constructor
    public Precioso(){
        this.controladorJPADepartamentoGL = new DepartamentoJpaController();
        this.controladorJPAEmpleadoGL = new EmpleadoJpaController();
        this.controladorJPAEvaluadorGL = new EvaluadorJpaController();
        this.controladorJPAProyectoGL = new ProyectoJpaController();
        this.controladorJPAUsuariosGL = new UsuariosJpaController();
        this.controladorJPAVersionesGL = new VersionesJpaController();
    }

    
    //Crear nuevos Departamentos
    public int crearDepartamento(Departamento d){
        int retorno = 0;
        try {
            this.controladorJPADepartamentoGL.create(d);
        } catch (PreexistingEntityException ex) {
            retorno = -1;
            System.out.println("Departamento existente");
        } catch (Exception ex) {
            retorno = -2;
            System.out.println("Error general en la BD o en Tabla");
        }
        return retorno;
    }


    //Crear nuevos Empleados
    public int crearEmpleado(Empleado e){
        int retorno = 0;
        try {
            this.controladorJPAEmpleadoGL.create(e);
        } catch (PreexistingEntityException ex) {
            retorno = -1;
            System.out.println("Empleado existente");
        } catch (Exception ex) {
            retorno = -2;
            System.out.println("Error general en la BD o en Tabla");
        }
        return retorno;
    }


    //Creaar nuevos Usuarios
    public int crearUsuario(Usuarios u){
        int retorno = 0;
        try {
            this.controladorJPAUsuariosGL.create(u);
        } catch (PreexistingEntityException ex) {
            retorno = -1;
            System.out.println("Usuario existente");
        } catch (Exception ex) {
            retorno = -2;
            System.out.println("Error general en la BD o en Tabla");
        }
        return retorno;
    }


    //Método que valida los usuarios de la aplicación, recibe un usuario y retorna un Map con 2
    //Posición y el objeto asociado al usuario, que puede ser un Evaluador o un Empleado
    public TreeMap validaUsuario(Usuarios u, String proceso){
        TreeMap retorno = new TreeMap();

        if(u == null){
            return retorno;
        } else if(u.getNombreusuario() == null || u.getPassword() == null){
            return retorno;
        }
        
        Usuarios usuario = new Usuarios();

        try{
            Object[] usu = (Object[]) this.controladorJPAUsuariosGL.getEntityManager().createNativeQuery("SELECT * FROM usuarios WHERE nombreusuario='"+u.getNombreusuario()+"' AND password='"+u.getPassword()+"'").getSingleResult();
            usuario.setNombreusuario(usu[0].toString());
            usuario.setPassword(usu[1].toString());
            usuario.setTipousuario(usu[2].toString());
        }
        catch(NoResultException e){
            usuario = null;
        }

        List opciones;

        try{
            if(usuario != null){
                opciones = this.controladorJPAVersionesGL.getEntityManager().createNativeQuery("SELECT opciones, acciones FROM versiones WHERE proceso='"+proceso+"' AND perfil='"+usuario.getTipousuario()+"'").getResultList();
            } else
                opciones = null;
        }
        catch(NoResultException e){
            opciones = null;
        }
        
        if(usuario != null){
            if(usuario.getTipousuario().equals("Evaluador")){
                Evaluador evaluadorActivo = (Evaluador) this.controladorJPAEvaluadorGL.getEntityManager().createNamedQuery("Evaluador.findByNombreusuario").setParameter("nombreusuario", u.getNombreusuario()).getSingleResult();
                retorno.put(0, evaluadorActivo);
                retorno.put(1, opciones);
                return retorno;

            } else if(usuario.getTipousuario().equals("Administrador")) {
                Empleado empleadoActivo = (Empleado) this.controladorJPAEmpleadoGL.getEntityManager().createNamedQuery("Empleado.findByNombreusuario").setParameter("nombreusuario", u.getNombreusuario()).getSingleResult();
                retorno.put(0, empleadoActivo);
                retorno.put(1, opciones);
                return retorno;

            } else{ 
                Empleado empleadoActivo = (Empleado) this.controladorJPAEmpleadoGL.getEntityManager().createNamedQuery("Empleado.findByNombreusuario").setParameter("nombreusuario", u.getNombreusuario()).getSingleResult();
                retorno.put(0, empleadoActivo);
                retorno.put(1, opciones);
                return retorno;
            }            
        }
        return retorno;
    }



    public Empleado generarListadoDeEmpleados(){
        List <Empleado> listaEmpleados = this.controladorJPAEmpleadoGL.getEntityManager().createNamedQuery("Empleado.findAll").getResultList();
        Empleado retorno = (Empleado)this.controladorJPAEmpleadoGL.getEntityManager().createNamedQuery("Empleado.findAll").getSingleResult();
        return retorno;
    }
    
    public int registrarDepartamento(Departamento d, String codDirector)
    {
        int retorno = 0;
        try {
            Empleado director = this.controladorJPAEmpleadoGL.findEmpleado(codDirector);
            d.setDirector(director);
            this.controladorJPADepartamentoGL.create(d);
        } catch (com.cast.s3p.persistencia.exceptions.PreexistingEntityException ex) {
           retorno = -1;
            System.out.println("Departamento existente");
        } catch (Exception ex) {
            retorno = -2;
            System.out.println("Error general en la BD o en Tabla");
        }
        return retorno;
    }
    
    public List <Empleado> generarListadoDeDirectores(){
        List <Empleado> listaDirectores = this.controladorJPAEmpleadoGL.findEmpleadoEntities();
        return listaDirectores;
    }


}
